#include <stdarg.h>
#include "allegro5/allegro.h"
#include "allegro5/allegro_font.h"
#include "allegro5/allegro_primitives.h"

#include "common.c"

#define MAX_EVENTS 23

static char events[MAX_EVENTS][1024];

static void add_event(char const *f, ...)
{
	va_list args;
	memmove(events[1], events[0], (MAX_EVENTS - 1) * 1024);
	va_start(args, f);
	vsnprintf(events[0], 1024, f, args);
	va_end(args);
}

const int WIN_WIDTH = 400;
const int WIN_HEIGHT = 300;

int main(int argc, char **argv)
{
	/*声明*/
	ALLEGRO_DISPLAY *display;
	ALLEGRO_EVENT_QUEUE *queue;
	ALLEGRO_EVENT event;
	ALLEGRO_FONT *font;
	ALLEGRO_COLOR color, black, red, blue;

	int i;

	(void)argc;
	(void)argv;

	/*allegro初始化*/
	if(!al_init()){
		abort_example("Could not init Allegro.\n");
	}

	al_init_primitives_addon();	/*初始化基元插件*/
	al_install_mouse();		/*安装鼠标驱动*/
	al_install_keyboard();	/*安装键盘驱动*/
	al_init_font_addon();	/*初始化字体插件*/

	al_set_new_display_flags(ALLEGRO_RESIZABLE);	/*设置窗口可缩放*/
	display = al_create_display(WIN_WIDTH, WIN_HEIGHT);	/*创建显示窗口*/
	if(!display){;
		abort_example("Error creating display\n");
	}

	al_set_window_title(display, "窗口标题");		/*创建窗口标题*/

	font = al_create_builtin_font();		/*创建字体*/
	if(!font){
		abort_example("Error creating buildin font\n");
	}

	/*初始化颜色*/
	black = al_map_rgb_f(0, 0, 0);
	red = al_map_rgb_f(1, 0, 0);
	blue = al_map_rgb_f(0, 0, 1);

	/*创建事件队列*/
	queue = al_create_event_queue();
	al_register_event_source(queue, al_get_mouse_event_source());	/*注册鼠标事件*/
	al_register_event_source(queue, al_get_keyboard_event_source());	/*注册键盘事件*/
	al_register_event_source(queue, al_get_display_event_source(display));	/*注册显示事件*/

	while(1){
		if(al_is_event_queue_empty(queue)){
			float x = 8, y = 28;
			al_clear_to_color(al_map_rgb(0xff, 0xff, 0xc0));	/*背景颜色*/

			al_draw_textf(font, blue, 8, 8, 0, "Hello World.");	/*写字*/

			color = red;
			for(i = 0; i < MAX_EVENTS; i++){
				if(!events[i]) continue;
				al_draw_textf(font, color, x, y, 0, "%s", events[i]);	/*循环打印事件*/
				color = black;
				y += 20;
			}
			al_flip_display();	/*更新显示*/
		}

		al_wait_for_event(queue, &event);	/*当队列有事件，会把事件存入event*/
		switch(event.type){
			case ALLEGRO_EVENT_MOUSE_ENTER_DISPLAY:
				add_event("ALLEGRO_EVENT_MOUSE_ENTER_DISPLAY");
				break;

			case ALLEGRO_EVENT_MOUSE_LEAVE_DISPLAY:
				add_event("ALLEGRO_EVENT_MOUSE_LEAVE_DISPLAY");
				break;

			case ALLEGRO_EVENT_KEY_DOWN:
				if(event.keyboard.keycode == ALLEGRO_KEY_ESCAPE){
					goto done;
				}
				else{
					add_event("ALLEGRO_EVENT_KEY_DOWN.keycode=%d", event.keyboard.keycode);
				}
				break;

			case ALLEGRO_EVENT_DISPLAY_RESIZE:
				add_event("ALLEGRO_EVENT_DISPLAY_RESIZE x=%d, y=%d, "
					"width=%d, height=%d",
					event.display.x, event.display.y, event.display.width,
					event.display.height);
				al_acknowledge_resize(event.display.source);
				break;

			case ALLEGRO_EVENT_DISPLAY_CLOSE:
				add_event("ALLEGRO_EVENT_DISPLAY_CLOSE");
				break;

			case ALLEGRO_EVENT_DISPLAY_LOST:
				add_event("ALLEGRO_EVENT_DISPLAY_LOST");
				break;

			case ALLEGRO_EVENT_DISPLAY_FOUND:
				add_event("ALLEGRO_EVENT_DISPLAY_FOUND");
				break;

			case ALLEGRO_EVENT_DISPLAY_SWITCH_OUT:
				add_event("ALLEGRO_EVENT_DISPLAY_SWITCH_OUT");
				break;

			case ALLEGRO_EVENT_DISPLAY_SWITCH_IN:
				add_event("ALLEGRO_EVENT_DISPLAY_SWITCH_IN");
				break;
		}
	}

done:
	al_destroy_event_queue(queue);	/*销毁事件队列*/	
	al_destroy_display(display);	/*销毁显示*/	

	return 0;
}